import sys
import subprocess
import os
import tempfile
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QMessageBox, QTextEdit


class CodeGeneratorApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 设置窗口标题和大小
        self.setWindowTitle("代码生成器")
        self.setGeometry(100, 100, 800, 800)  # 调整窗口大小以容纳日志框

        # 创建布局
        layout = QVBoxLayout()

         # 输入框配置：标签、提示文本、默认值
        field_configs = [
            {"label": "url",
             "placeholder": "例如：jdbc:mysql://localhost:3306/dbname",
             "default": "localhost:3306/lims-959552"},

            {"label": "账号",
             "placeholder": "请输入数据库账号",
             "default": "root"},

            {"label": "密码",
             "placeholder": "请输入数据库密码",
             "default": "123456"},

            {"label": "模块名",
             "placeholder": "例如：system",
             "default": "demo"},

            {"label": "表名",
              "placeholder": "请输入表名称，例如：t_zzh",
             "default": ""},  # 留空

            {"label": "代码路径",
             "placeholder": "请输入项目路径，例如：D:/projects/code",
             "default": os.path.expanduser("")}  # 使用用户主目录
        ]

        self.inputs = []
        for config in field_configs:
            label = QLabel(config["label"])
            input_box = QLineEdit()

            # 设置提示文本（灰色）
            input_box.setPlaceholderText(config["placeholder"])

            # 设置默认值（真实文本）
            if config["default"]:
                input_box.setText(config["default"])

            self.inputs.append(input_box)
            layout.addWidget(label)
            layout.addWidget(input_box)

        # 添加提交按钮
        submit_button = QPushButton("生成代码")
        submit_button.clicked.connect(self.generate_code)
        layout.addWidget(submit_button)

        # 添加日志框
        self.log_box = QTextEdit()
        self.log_box.setReadOnly(True)  # 设置为只读
        self.log_box.setPlaceholderText("日志信息将显示在这里...")
        layout.addWidget(self.log_box)

        # 设置布局
        self.setLayout(layout)

    def generate_code(self):
        # 检查 Java 版本
        self.check_java_version()

        # 获取输入框的值
        params = [input_box.text() for input_box in self.inputs]

        # 检查是否所有参数都已填写
        if any(param == "" for param in params):
            QMessageBox.warning(self, "错误", "请填写所有参数！")
            return

        # 提取JAR包到临时目录
        try:
            # 获取JAR包的路径
            jar_path = self.extract_jar("code_generator.jar")
            # self.log("JAR包已提取到: " + jar_path)

            # 设置工作目录为 D:\zzh
            working_dir = params[len(params)-1];
            # self.log("工作目录: "+working_dir);
            # self.log("传入的参数: " + ", ".join(params))
            params.pop();
            if not os.path.exists(working_dir):
                os.makedirs(working_dir)  # 如果文件夹不存在，则创建它
            os.chdir(working_dir)
            # self.log(f"工作目录已设置为: {working_dir}")

            # 打印传入的参数
            # self.log("传入的参数: " + ", ".join(params))

            # 调用Java JAR包
            # self.log("正在调用JAR包...")
            result = subprocess.run(
                ["java", "-jar", jar_path, *params],
                stdout=subprocess.DEVNULL,  # 不捕获标准输出
                # stderr=subprocess.DEVNULL,  # 不捕获标准错误
                # capture_output=True,
                text=True,
            )

            # 显示生成结果
            if result.returncode == 0:
                self.log("代码生成成功！")
                # self.log("输出结果:\n" + result.stdout)
            else:
                self.log("代码生成失败！")
                # self.log("错误信息:\n" + result.stderr)

            # 显示 JAR 包的所有日志（标准输出和标准错误）
            # self.log("JAR 包日志输出:\n" + result.stdout)
            # self.log("JAR 包错误输出:\n" + result.stderr)

            # 弹出提示框
            if result.returncode == 0:
                QMessageBox.information(self, "成功", "代码生成成功！")
            else:
                QMessageBox.critical(self, "错误", "代码生成失败！")
        except Exception as e:
            self.log("调用JAR包时发生错误: " + str(e))
            QMessageBox.critical(self, "错误", f"调用JAR包时发生错误：{str(e)}")

    def extract_jar(self, jar_name):
        # 获取 JAR 包的路径
        if getattr(sys, 'frozen', False):
            # 如果程序是打包后的 EXE 文件
            base_path = sys._MEIPASS
        else:
            # 如果程序是 Python 脚本
            base_path = os.path.dirname(os.path.abspath(__file__))

        jar_path = os.path.join(base_path, jar_name)

        # 检查 JAR 包是否存在
        if not os.path.exists(jar_path):
            raise FileNotFoundError(f"JAR 包未找到: {jar_path}")

        # self.log(f"JAR 包路径: {jar_path}")  # 打印路径
        return jar_path

    def check_java_version(self):
        try:
            result = subprocess.run(["java", "-version"], capture_output=True, text=True)
            self.log("Java 版本信息:\n" + result.stderr)
        except Exception as e:
            self.log("无法找到 Java: " + str(e))

    def log(self, message):
        # 在日志框中显示日志信息
        self.log_box.append(message)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = CodeGeneratorApp()
    window.show()
    sys.exit(app.exec_())